optimize [QDate|QTime|QDateTime]::fromString format literals. (#1278)
authortsteven4 <13596209+tsteven4@users.noreply.github.com>
Wed, 4 Sep 2024 17:51:18 +0000 (11:51 -0600)
committerGitHub <noreply@github.com>
Wed, 4 Sep 2024 17:51:18 +0000 (11:51 -0600)
* optimize [QDate|QTime|QDateTime]::fromString format literals.

These accept QStringViews in Qt6 which can be very efficiently
passed with UTF-16 character literals.

* optimize QDateTime::toString format literals.

This isn't new to Qt6, but we had a few we hadn't taken care of
yet.

* use QString::replace(QChar, QChar) instead of (QString, QString)

13 files changed:
exif.cc
garmin_txt.cc
gdb.cc
gui/gmapdlg.cc
gui/gpx.cc
igc.cc
mtk_logger.cc
nmea.cc
subrip.cc
trackfilter.cc
unicsv.cc
waypt.cc
xcsv.cc

diff --git a/exif.cc b/exif.cc
index 4982f598948e2cfd2d81a89b4a8f4c2a07192afc..553a4775bc13c12bb4ac9687850d04792ceb1dbf 100644 (file)
--- a/exif.cc
+++ b/exif.cc
@@ -267,7 +267,7 @@ ExifFormat::exif_read_timestamp(const ExifTag* tag)
 QDate
 ExifFormat::exif_read_datestamp(const ExifTag* tag)
 {
-  return QDate::fromString(tag->data.at(0).toByteArray().constData(), "yyyy:MM:dd");
+  return QDate::fromString(tag->data.at(0).toByteArray().constData(), u"yyyy:MM:dd");
 }
 
 void
@@ -697,7 +697,7 @@ ExifFormat::exif_get_exif_time(ExifApp* app) const
     // Note the assumption of local time can be problematic if the data
     // is processed in a different time zone than was used in recording
     // the time in the image.
-    res = QDateTime::fromString(str, "yyyy:MM:dd hh:mm:ss");
+    res = QDateTime::fromString(str, u"yyyy:MM:dd hh:mm:ss");
 
     // Exif 2.31 added offset tags to record the offset to UTC.
     // If these are present use them, otherwise assume local time.
index 8a8760a63c0e7b66707ae7c5031fe097210387ff..fdd4fdf465e83fed7d6ef6377be0025cdf9bb21f 100644 (file)
@@ -751,7 +751,7 @@ GarminTxtFormat::write()
   };
 
   QString grid_str = gt_get_mps_grid_longname(grid_index, MYNAME);
-  grid_str = grid_str.replace('*', "°");
+  grid_str = grid_str.replace('*', u'°');
   *fout << "Grid\t" << grid_str << "\r\n";
 
   datum_str = gt_get_mps_datum_name(datum_index);
diff --git a/gdb.cc b/gdb.cc
index baf0773c8df47a9ec452d28c84980d5a10711dbe..5a2d4e2addd777d407df764792ba5a895563579a 100644 (file)
--- a/gdb.cc
+++ b/gdb.cc
@@ -1133,8 +1133,8 @@ GdbFormat::write_header()
     */
   static const QDateTime gdb_release_dt = QDateTime(QDate(2011, 4, 14), QTime(1, 30, 1), Qt::UTC);
   gdb_write_cstr(QStringLiteral("GPSBabel-%1").arg(gpsbabel_version));
-  gdb_write_cstr(gdb_release_dt.toString("MMM dd yyyy"));
-  gdb_write_cstr(gdb_release_dt.toString("HH:mm:ss"));
+  gdb_write_cstr(gdb_release_dt.toString(u"MMM dd yyyy"));
+  gdb_write_cstr(gdb_release_dt.toString(u"HH:mm:ss"));
 
   finalize_item(fsave, 'A');
 
index d5325d45ccaef6b65b6db162e903628c4b9c6559..02de27d175796873966362d8cffb517d47588f16 100644 (file)
@@ -112,9 +112,9 @@ void GMapDialog::appendTrackInfo(QStandardItem* it, const GpxTrack& trk)
   }
   if (startTime.isValid()) {
     it->appendRow(new StandardItem(tr("Start: %1")
-                                   .arg(startTime.toString("yyyy-MMM-dd HH:mm:ss"))));
+                                   .arg(startTime.toString(u"yyyy-MMM-dd HH:mm:ss"))));
     it->appendRow(new StandardItem(tr("Stop: %1")
-                                   .arg(stopTime.toString("yyyy-MMM-dd HH:mm:ss"))));
+                                   .arg(stopTime.toString(u"yyyy-MMM-dd HH:mm:ss"))));
   }
   it->appendRow(new StandardItem(tr("Points: %1").arg(count)));
 
index 93168f2c04bc9b61198fcabe988aae2777989a18..32c99b31f4d3822b34d8fc004b772a0829b5a5d1 100644 (file)
@@ -32,7 +32,7 @@
 
 static QDateTime decodeDateTime(const QString& s)
 {
-  QDateTime utc = QDateTime::fromString(s, "yyyy-MM-dd'T'HH:mm:ss'Z'");
+  QDateTime utc = QDateTime::fromString(s, u"yyyy-MM-dd'T'HH:mm:ss'Z'");
   return utc;
 }
 
diff --git a/igc.cc b/igc.cc
index f93bb793c1324200edc72bfc87c52c2c05afe76e..7ef925ee9633de9191b05739aa3e6521b7b28d6e 100644 (file)
--- a/igc.cc
+++ b/igc.cc
@@ -646,7 +646,7 @@ QByteArray IgcFormat::latlon2str(const Waypoint* wpt)
 
 QByteArray IgcFormat::date2str(const gpsbabel::DateTime& dt)
 {
-  QByteArray str = dt.toUTC().toString("ddMMyy").toUtf8();
+  QByteArray str = dt.toUTC().toString(u"ddMMyy").toUtf8();
   if (str.size() != 6) {
     fatal(MYNAME ": Bad date format '%s'\n", str.constData());
   }
@@ -655,7 +655,7 @@ QByteArray IgcFormat::date2str(const gpsbabel::DateTime& dt)
 
 QByteArray IgcFormat::tod2str(const gpsbabel::DateTime& tod)
 {
-  QByteArray str = tod.toUTC().toString("hhmmss").toUtf8();
+  QByteArray str = tod.toUTC().toString(u"hhmmss").toUtf8();
   if (str.size() != 6) {
     fatal(MYNAME ": Bad time of day format '%s'\n", str.constData());
   }
index ac748359366a132f0e4149ef4274cf7e18479d2b..ea7fcebbf913506af255a1091dce76483244b90d 100644 (file)
@@ -842,7 +842,7 @@ int MtkLoggerBase::csv_line(gbfile* csvFile, int idx, unsigned long bmask, data_
     QDateTime dt = QDateTime::fromSecsSinceEpoch(itm->timestamp, Qt::UTC);
     dt = dt.addMSecs(itm->timestamp_ms);
 
-    QString timestamp = dt.toUTC().toString("yyyy/MM/dd,hh:mm:ss.zzz");
+    QString timestamp = dt.toUTC().toString(u"yyyy/MM/dd,hh:mm:ss.zzz");
     gbfputs(timestamp, csvFile);
     gbfputc(',', csvFile);
   }
diff --git a/nmea.cc b/nmea.cc
index 0e1f3521329510b23bed977277f766873a2246db..f07d78b9f88cc7dd4a341cd082663f64aede8b96 100644 (file)
--- a/nmea.cc
+++ b/nmea.cc
@@ -358,7 +358,7 @@ QTime NmeaFormat::nmea_parse_hms(const QString& str)
   QTime retval; /* invalid time */
   const QStringList parts = str.trimmed().split('.');
   if ((parts.size() == 1) || (parts.size() == 2)) {
-    retval = QTime::fromString(parts.at(0), "hhmmss");
+    retval = QTime::fromString(parts.at(0), u"hhmmss");
     if (retval.isValid() && parts.size() == 2) {
       bool ok;
       // prepend "0.".  prepending "." won't work if there are no trailing digits.
@@ -539,7 +539,7 @@ NmeaFormat::gprmc_parse(const QString& ibuf)
   if (fields.size() > 9) {
     QString datestr(fields[9]);
     datestr.insert(4, "20");
-    dmy = QDate::fromString(datestr, "ddMMyyyy");
+    dmy = QDate::fromString(datestr, u"ddMMyyyy");
   }
   if (fix != 'A') {
     /* ignore this fix - it is invalid */
@@ -635,7 +635,7 @@ NmeaFormat::gpzda_parse(const QString& ibuf)
   if (fields.size() > 4) {
     QTime time = nmea_parse_hms(fields[1]);
     QString datestr = QStringLiteral("%1%2%3").arg(fields[2], fields[3], fields[4]);
-    QDate date = QDate::fromString(datestr, "ddMMyyyy");
+    QDate date = QDate::fromString(datestr, u"ddMMyyyy");
 
     // The prev_datetime data member might be used by
     // nmea_fix_timestamps and nmea_set_waypoint_time.
@@ -997,7 +997,7 @@ NmeaFormat::read()
   }
 
   if (optdate) {
-    opt_tm = QDate::fromString(optdate, "yyyyMMdd");
+    opt_tm = QDate::fromString(optdate, u"yyyyMMdd");
     if (!opt_tm.isValid()) {
       fatal(MYNAME ": Invalid date \"%s\"!\n", optdate);
     }
index 1fda7ad0736c41404ec14d4e9b4e89ec80f4ad94..ee6116b5818aad6a2575b421354912470e2bb44c 100644 (file)
--- a/subrip.cc
+++ b/subrip.cc
@@ -210,13 +210,13 @@ SubripFormat::wr_init(const QString& fname)
   }
   gps_datetime = QDateTime();
   if ((opt_gpstime != nullptr) && (opt_gpsdate != nullptr)) {
-    QDate gps_date = QDate::fromString(opt_gpsdate, "yyyyMMdd");
+    QDate gps_date = QDate::fromString(opt_gpsdate, u"yyyyMMdd");
     if (!gps_date.isValid()) {
       fatal(FatalMsg().nospace() << MYNAME ": option gps_date value (" << opt_gpsdate << ") is invalid.  Expected yyyymmdd.");
     }
-    QTime gps_time = QTime::fromString(opt_gpstime, "HHmmss");
+    QTime gps_time = QTime::fromString(opt_gpstime, u"HHmmss");
     if (!gps_time.isValid()) {
-      gps_time = QTime::fromString(opt_gpstime, "HHmmss.z");
+      gps_time = QTime::fromString(opt_gpstime, u"HHmmss.z");
       if (!gps_time.isValid()) {
         fatal(FatalMsg().nospace() << MYNAME ": option gps_time value (" << opt_gpstime << ") is invalid.  Expected hhmmss[.sss]");
       }
@@ -226,9 +226,9 @@ SubripFormat::wr_init(const QString& fname)
 
   video_offset_ms = 0;
   if (opt_videotime != nullptr) {
-    QTime video_time = QTime::fromString(opt_videotime, "HHmmss");
+    QTime video_time = QTime::fromString(opt_videotime, u"HHmmss");
     if (!video_time.isValid()) {
-      video_time = QTime::fromString(opt_videotime, "HHmmss.z");
+      video_time = QTime::fromString(opt_videotime, u"HHmmss.z");
       if (!video_time.isValid()) {
         fatal(FatalMsg().nospace() << MYNAME ": option video_time value (" << opt_videotime << ") is invalid.  Expected hhmmss[.sss].");
       }
index 0d43a42b4fdb226b2103ee583483b83edc0a34db..06f7c8bf3d75ca7ad154a1792cdf29e97cffaf3c 100644 (file)
@@ -675,7 +675,7 @@ QDateTime TrackFilter::trackfilter_range_check(const char* timestr)
   QRegularExpressionMatch match = re.match(fmtstart);
   if (match.hasMatch()) {
     // QTime::fromString zzz expects exactly 3 digits representing milliseconds.
-    result = QDateTime::fromString(match.captured(0), "yyyyMMddHHmmss.zzz");
+    result = QDateTime::fromString(match.captured(0), u"yyyyMMddHHmmss.zzz");
     result.setTimeSpec(Qt::UTC);
     if (!result.isValid()) {
       fatal(MYNAME "-range-check: Invalid timestamp \"%s\"!\n", timestr);
@@ -833,7 +833,7 @@ TrackFilter::faketime_t TrackFilter::trackfilter_faketime_check(const char* time
     QString start = match.captured(2);
     QString fmtstart("00000101000000");
     fmtstart.replace(0, start.size(), start);
-    result.start = QDateTime::fromString(fmtstart, "yyyyMMddHHmmss");
+    result.start = QDateTime::fromString(fmtstart, u"yyyyMMddHHmmss");
     result.start.setTimeSpec(Qt::UTC);
     if (!result.start.isValid()) {
       fatal(MYNAME "-faketime-check: Invalid timestamp \"%s\"!\n", qPrintable(start));
index 2c4cbbe6d6e196634b027a46e86b3e47e7d62918..53b00a27e8da2d4633f6b346945a2a9f036e494d 100644 (file)
--- a/unicsv.cc
+++ b/unicsv.cc
@@ -470,7 +470,7 @@ UnicsvFormat::rd_init(const QString& fname)
   fin->open(fname, QIODevice::ReadOnly, MYNAME, opt_codec);
   unicsv_lineno = 0;
   if (opt_fields) {
-    QString fields = QString(opt_fields).replace("+", ",");
+    QString fields = QString(opt_fields).replace('+', ',');
     unicsv_fondle_header(fields);
   } else if (buff = fin->readLine(); !buff.isNull()) {
     ++unicsv_lineno;
@@ -1105,8 +1105,8 @@ UnicsvFormat::unicsv_print_str(const QString& s) const
     // slavish re-implementation of (what I think) the original C code
     // was doing.
     t.replace("\r\n", ",");
-    t.replace("\r", ",");
-    t.replace("\n", ",");
+    t.replace('\r', ',');
+    t.replace('\n', ',');
   }
   *fout << t.trimmed();
 }
index 191cdc84142a6ad80edf1bca87867440c6740e04..1d476c3d773ac99be4976e4ec1f1bc5c09dfe9f6 100644 (file)
--- a/waypt.cc
+++ b/waypt.cc
@@ -519,12 +519,11 @@ Waypoint::CreationTimeXML() const
 
   QDateTime dt = GetCreationTime().toUTC();
 
-  const char* format = "yyyy-MM-ddTHH:mm:ssZ";
   if (dt.time().msec()) {
-    format = "yyyy-MM-ddTHH:mm:ss.zzzZ";
+    return dt.toString(u"yyyy-MM-ddTHH:mm:ss.zzzZ");
+  } else {
+    return dt.toString(u"yyyy-MM-ddTHH:mm:ssZ");
   }
-
-  return dt.toString(format);
 }
 
 gpsbabel::DateTime
diff --git a/xcsv.cc b/xcsv.cc
index b1cc09112eb7d910b136a574a7fc070f8621e049..050f2b231cf86c4f53c0a6183b6d62bf240b01f2 100644 (file)
--- a/xcsv.cc
+++ b/xcsv.cc
@@ -249,7 +249,7 @@ XcsvStyle::xcsv_ofield_add(XcsvStyle* style, const QString& qkey, const QString&
 QDate
 XcsvFormat::yyyymmdd_to_time(const QString& s)
 {
-  return QDate::fromString(s, "yyyyMMdd");
+  return QDate::fromString(s, u"yyyyMMdd");
 }
 
 QDateTime